#ifndef __cpu_peri_gpio_h_
#define __cpu_peri_gpio_h_

#ifdef __cplusplus
extern "C" {
#endif

// =============================================================================
// @brief: GPIO引脚配置，包括引脚的模式、输入类型、速度、上下拉类型等
// @param: port，被操作的port编号，比如要操作GPIOA,PIN5,则port=GPIO_A
// @param: Msk，操作的掩码，如操作的是GPIOA,PIN5，则msk = (1<<5).
// @param: Mode,模式，分为输入、输出、模拟输入、AF复用功能
// @param: OutType,推挽输出或开漏输出
// @param: Speed,速度，如GPIO_SPEED_50M
// @param: PUPD,上拉或下拉
// @retval: 无
// =============================================================================
void GPIO_CfgPinFunc(u32 port, u32 Msk, u32 Mode, u32 OutType, u32 Speed, u32 PUPD);

// =============================================================================
// @brief: 设置利用功能号
// @param: port，被操作的port编号，比如要操作GPIOA,PIN5,则port=GPIO_A
// @param: pinnum,IO号，如GPIOA,PIN5,则pinnum = 5
// @param: af_no，利用功能号
// @retval: 无
// =============================================================================
u32 GPIO_AFSet(u32 port, u32 pinnum, u32 af_no);

// =============================================================================
// @brief: 把某gpio port整体读入
// @param: port，被操作的port编号，比如要操作GPIOA,则port=GPIO_A
// @retval: 读得的数据
// =============================================================================
u32 GPIO_GetData(u32 port);

// =============================================================================
// @brief: 把数据整体输出到某gpio port
// @param: port，被操作的port编号，比如要操作GPIOA,则port=GPIO_A
// @param: data，待输出的数据
// @retval: 无
// =============================================================================
void GPIO_OutData(u32 port, u32 data);

// =============================================================================
// @brief: 在port中msk中是1的bit对应的位输出高电平
// @param: port，被操作的port编号，比如要操作GPIOA,则port=GPIO_A
// @param: mask，port中需要输出高电平的位掩码，比如操作GPIOA,PIN5，msk = (1<<5)
// @retval: 无
// =============================================================================
void GPIO_SettoHigh(u32 port, u32 msk);

// =============================================================================
// @brief: 在port中msk中是1的bit对应的位输出低电平
// @param: port，被操作的port编号，比如要操作GPIOA,则port=GPIO_A
// @param: mask，port中需要输出高电平的位掩码,比如操作PIOA,PIN5，msk = (1<<5)
// @retval: 无
// =============================================================================
void GPIO_SettoLow(u32 port, u32 msk);

// =============================================================================
// @brief: 打开GPIOA-GPIOI的时钟输出
// @param: port,端口号，如GPIO_A
// @retval: 无
// =============================================================================
void GPIO_PowerOn(u32 port);

// =============================================================================
// @brief: 为了节能，降低功耗，直接关闭GPIOA-GPIOI的时钟输出
// @param: port,端口号，如GPIO_A
// @retval: 无
// =============================================================================
void GPIO_PowerOff(u32 port);

#ifdef __cplusplus
}
#endif

#endif /*__cpu_peri_gpio_h_*/
